home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 3 / Amethyst.iso / live / usr / lib / rpm-3.0.6 / fixup.pl < prev    next >
Encoding:
Perl Script  |  2000-06-06  |  3.3 KB  |  136 lines

  1. #!/usr/bin/perl -w
  2. # $Id: fixup.pl,v 1.6 1997/11/24 05:35:36 ray Exp ray $
  3. #use strict;
  4.  
  5. ($C = $0) =~ s%.*/%%;
  6.  
  7. my $Target = "";
  8. my $Rght = "";
  9. my $Wrng = "";
  10. my $RE = "";
  11.  
  12. my $Help = 0;
  13. my $OptErr = "";
  14. my $Global = 0;
  15. my $First = 1;
  16. my $Orig = 0;
  17. my $verbose = 0;
  18. my $debug = 0;
  19.  
  20. sub Usage ($$) {
  21.   my( $rv, $msg) = @_;
  22.   print( STDERR $msg . "\n") if ( $msg );
  23.   printf( STDERR "Usage: $C [options] target wrong right\n");
  24.   $rv = 0 if ( $Opt{'help'} );
  25.   exit( $rv);
  26. }
  27.  
  28. sub cpmod($$) {
  29.   my( $Org, $Dup) = @_;
  30.   my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
  31.       $atime,$mtime,$ctime,$blksize,$blocks) = stat($Org);
  32.   $mode &= 007777;
  33.   chown( $uid, $gid, $Dup) || die( "$CMD: cannot chown( $uid, $gid, $Dup).\n");
  34.   chmod( $mode, $Dup) || die( "$CMD: cannot chmod( $mode, $Dup).\n");
  35.   utime( $atime, $mtime, $Dup) || die( "$CMD: cannot utime( $Dup).\n");
  36. }
  37.  
  38. {
  39.   use Getopt::Long;
  40.   $Getopt::Long::debug = 0;
  41.   $Getopt::Long::ignorecase = 0;
  42.   #$Getopt::Long::pass_through = 1;
  43.   $Getopt::Long::bundling = 1;
  44.   %Opt = ();
  45.  
  46.   Usage(1, "") unless ( GetOptions( \%Opt,
  47.     'help|h', 'verbose|v', 'debug|d', 'orig|b',
  48.     'global|g', 'interpreter-only|i',
  49.     'target|T=s', 'RE|e=s') && ! $Opt{'help'} );
  50.  
  51.   ( $Global ++, $First = 0 ) if ( $Opt{'global'} );
  52.   ( $RE = $Opt{'RE'}, $Global ++, $First = 0 ) if ( $Opt{'RE'} );
  53.   $First ++ if ( $Opt{'interpreter-only'} );
  54.   $Orig ++ if ( $Opt{'orig'} );
  55.   $verbose ++ if ( $Opt{'verbose'} );
  56.   ( $debug ++, $verbose ++ ) if ( $Opt{'debug'} );
  57.   $Help ++ if ( $Opt{'help'} );
  58.   $Target = $Opt{'target'} if ( $Opt{'target'} );
  59.  
  60. }
  61.  
  62.  
  63. if ( $#ARGV >= $[ ) {
  64.   Usage( 1, "") unless ( $#ARGV == $[ + 2 && ! $Target && ! $RE );
  65.   $Target = shift;
  66.   $Wrng = shift;
  67.   $Rght = shift;
  68.   printf( STDERR "Target='%s' Wrng='%s' Rght='%s'\n", $Target, $Wrng, $Rght)
  69.      if ( $debug );
  70. } elsif ( ! $Target ) {
  71.   Usage( 2, "$C: no target specified.\n");
  72. } elsif ( ! -e "$Target" ) {
  73.   Usage( 3, "$C: $Target: no such object.\n");
  74. } elsif ( ! $RE ) {
  75.   Usage( 4, "");
  76. }
  77.  
  78. if ( $First ) {
  79.   Usage( 5, "$C: '--interpreter-only' and '--re' are mutual exclusive.\n")
  80.      if ( $RE );
  81.   Usage( 6, "$C: '--global' and '--interpreter-only' are mutual exclusive.\n")
  82.      if ( $Global );
  83.   Usage( 7, "$C: '--interpreter-only' requires 'wrong' and 'right'.\n")
  84.      unless ( $Wrng && $Rght );
  85.   $RE= 's^(\#\!\s*\S*)' . $Wrng . '$1' . $Rght . 'o';
  86. } else {
  87.   $RE= 's' . $Wrng . '' . $Rght . 'ogs' unless ( $RE );
  88. }
  89. undef( $Wrng);
  90. undef( $Rght);
  91. printf( STDERR "Target='%s' RE='%s'\n", $Target, $RE) if ( $debug );
  92. #exit(42);
  93.  
  94. open( FIND, "find $Target -type f -print |") || die;
  95.  
  96. while ( defined($f = <FIND>) ) {
  97.   chop($f);
  98.   my $n = $f . ".fixed" . $$;
  99.   my $m = 0;
  100.   next unless ( -s $f );
  101.   open( IN, "< $f") || die;
  102.   open( OUT, "> $n") || die;
  103.  
  104.   $_ = <IN>;
  105.   if ( $Global ) {
  106.     do {
  107.       $m += eval "$RE";
  108.       print( OUT $_) || die;
  109.     } while ( <IN> );
  110.   } else {
  111.     $m += eval $RE;
  112.     if ( $m ) {  
  113.       do {
  114.         print( OUT $_) || die;
  115.       } while ( <IN> );
  116.     }
  117.   }
  118.   close( OUT);
  119.   if ( $m ) {
  120.     printf( "%s: %d occurance%s\n", $f, $m, ($m == 1)?"":"s") if ( $verbose );
  121.     cpmod( $f, $n);
  122.     if ( $Orig ) {
  123.       rename( $f, $f . ".orig") || die;
  124.     }
  125.     rename( $n, $f) || die;
  126.   } else {
  127.     unlink( $n) || die;
  128.     printf( "%s: OK\n", $f) if ( $verbose >= 2 );
  129.   }
  130.   close( IN);
  131. }
  132.  
  133. exit( 0);
  134.  
  135.  
  136.